import axios from 'axios';
import router from '../router/index';
import { logRequest, logResponse } from '../utils/debug';
import config from '../config';

// 使用全局配置
const api = axios.create({
  baseURL: config.apiBaseUrl,
  timeout: config.requestTimeout,
  headers: {
    'Content-Type': 'application/json'
  },
  // 允许跨域请求携带cookie
  withCredentials: true
});

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 记录请求信息
    logRequest(config.method?.toUpperCase() || 'UNKNOWN', config.url || '', config.data);
    
    const token = localStorage.getItem('jwt_token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    
    // 对于FormData类型的请求，不设置Content-Type，让浏览器自动设置
    if (config.data instanceof FormData) {
      delete config.headers['Content-Type'];
    }
    
    return config;
  },
  error => {
    logResponse('REQUEST_ERROR', error.config?.url || '', null, error);
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  response => {
    // 记录响应信息
    logResponse(response.config.method?.toUpperCase() || 'UNKNOWN', response.config.url || '', response.data);
    
    if (response.data.code === 0 || response.data.code === 200) {
      return response.data;
    } else {
      // 统一处理非成功状态码
      const error = new Error(response.data.msg || '请求失败');
      error.name = response.data.code.toString();
      return Promise.reject(error);
    }
  },
  error => {
    // 记录错误信息
    logResponse('RESPONSE_ERROR', error.config?.url || '', null, error);
    
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 未授权，跳转到登录页
          localStorage.removeItem(config.storage.token);
          localStorage.removeItem(config.storage.username);
          localStorage.removeItem(config.storage.uid);
          // 使用全局路由实例
          router.push('/login');
          break;
        case 429:
          // 请求过于频繁
          alert('请求过于频繁，请稍后再试');
          break;
      }
    }
    return Promise.reject(error);
  }
);

// 提供额外的请求方法，支持不同的内容类型
export const apiFormData = {
  post: (url: string, data: any) => {
    const formData = new FormData();
    Object.entries(data).forEach(([key, value]) => {
      if (value !== undefined && value !== null) {
        formData.append(key, value as string);
      }
    });
    
    return api.post(url, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    });
  }
};

export default api; 